package avicit.cbb.elefileupdown.service;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>金航数码科技有限责任公司</p>
 * <p>作者：钟一华</p>
 * <p>邮箱：feifan1985@163.com</p>
 * <p>创建时间： 2015-6-10 下午6:21:09 </p>
 * <p>类说明：附件上传接口定义</p>
 * <p>修改记录： </p>
 */
public interface FileUploadIntfsService {

	/**
	 * 保存docrelation和sysmarker数据方法
	 * @param relationParam
	 * @param markerParam
	 * @throws Exception void
	 * @throws
	 */
	public void saveDocRelationSysMarkerData(Map<String, Object> relationParam, Map<String, Object> markerParam) throws Exception;

	/**
	 * 添加全文文件关系表数据
	 * @author 钟一华
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param param
	 * @throws Exception void
	 * @throws
	 */
	public String insertDocRelationDataByIntfs(String orgId, String deptId, String sysId, Map<String, Object> param) throws Exception;

	/**
	 * 更新全文文件关系表数据
	 * @author 钟一华
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param param
	 * @throws Exception void
	 * @throws
	 */
	public void updateDocRelationDataByIntfs(String orgId, String deptId, String sysId, Map<String, Object> param) throws Exception;

	/**
	 * 根据数据id和附件id判断关系表是否存在该数据
	 * @author 钟一华
	 * @param param
	 * @return
	 * @throws Exception boolean
	 * @throws
	 */
	public boolean getDocRelationIsExistByParamByIntfs(Map<String, Object> param) throws Exception;

	/**
	 * 获得附件编辑页面html
	 * @author 钟一华
	 * @return
	 * @throws Exception List<Object[]>
	 * @throws
	 */
	public List<Object[]> getAttachmentAndRelationAndUserDatas(String formId) throws Exception;
	
	/**
	 * 通过数据id获得关系信息集合
	 * @param formId
	 * @return
	 * @throws Exception List<Map<String,Object>>
	 * @throws
	 */
	public List<Map<String, Object>> getAttachmentRelationByFormId(String formId) throws Exception;

	/**
	 * 删除附件各类数据(附件表,mongdb表,relation表,marker表)
	 * @author 钟一华
	 * @param param (sysId: 系统标识attachId: 附件id)
	 * @throws Exception void
	 * @throws
	 */
	public void deleteAttachByAttachIdAndSysId(Map<String, Object> param) throws Exception;

	/**
	 * 保存全文文件关系、保存文件缩略图
	 * @param parameter
	 */
	public void saveRelationAndMarker(Map<String, Object> parameter) throws Exception;

	/**
	 * 删除全文文件关系、删除文件缩略图
	 * @param parameter
	 */
	public void deleteRelationAndMarker(Map<String, Object> parameter);

	/**
	 * 重新生成缩略图
	 * @param parameter
	 */
	public void saveMarker(Map<String, Object> parameter) throws Exception;

	/**
	 * 获取文件流
	 * @param param
	 * @return
	 */
	public byte[] getFileByte(Map<String, Object> param) throws Exception;

	/**
	 * 修改是否封面
	 * @param oldFileMap
	 * @param mongoId
	 */
	public void updateCoverType(Map<String, String> oldFileMap, String mongoId);

	/**
	 * 保存图片
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param flag（1：照片；2：视频；3：音频；4：其他）
	 * @param path
	 * @param params
	 * @throws Exception
	 */
	public void savePic(String orgId, String deptId, String sysId, String flag, String path, Map<String, Object> params) throws Exception;

	/**
	 * 处理视频缩略图
	 * @param vedioPath
	 * @param ffmpegPath
	 * @param thumbnailPath
	 * @return
	 * @throws Exception
	 */
	public boolean processImg(String vedioPath, String ffmpegPath, String thumbnailPath) throws Exception;

	/**
	 * 图片缩略图切割 --- 根据文件地址 生成图片缩略图
	 * @param fileFromPath 图片源文件地址
	 * @param fileOutPath 图片缩略图地址
	 * @param outWidth  图片缩略图宽度
	 * @param outHeight 图片缩略图高度
	 * @param scale 缩放比例
	 * @param rotate 旋转度数
	 * @return
	 * @throws Exception
	 */
	public void chreatePictureChange(String fileFromPath, String fileOutPath, Integer outWidth, Integer outHeight, Float scale, Integer rotate) throws Exception;

	/**
	 * 图片缩略图切割 --- 根据文件流 生成图片缩略图
	 * @param fileFrom 图片源文件地址
	 * @param fileOutPath 图片缩略图地址
	 * @param outWidth  图片缩略图宽度
	 * @param outHeight 图片缩略图高度
	 * @param scale 缩放比例
	 * @param rotate 旋转度数
	 * @return
	 * @throws Exception
	 */
	public void chreatePictureChange(InputStream fileFrom, String fileOutPath, Integer outWidth, Integer outHeight, Float scale, Integer rotate) throws Exception;

	/**
	 * 保存文件至项目目录
	 * @param fileFrom
	 * @param attId
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param params
	 * @return
	 * @throws Exception
	 */
	public void saveFileToDir(InputStream fileFrom, String attId, String orgId, String deptId, String sysId, Map<String, Object> params) throws Exception;

	/**
	 * 保存缩略图至数据库
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param is
	 * @param params 
	 * @throws Exception
	 */
	public void saveThumToDb(String orgId, String deptId, String sysId, InputStream is, Map<String, Object> params) throws Exception;

	/**
	 * 保存图片
	 * baibin
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param flag（1：照片；2：视频；3：音频；4：其他）
	 * @param path
	 * @param params
	 * @throws Exception
	 */
	public void updatePic(String orgId, String deptId, String sysId, String flag, String path, Map<String, Object> params) throws Exception;

	/**
	 * 保存缩略图至数据库
	 * baibin
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param is
	 * @param params 
	 * @throws Exception
	 */
	public void updateThumToDb(String orgId, String deptId, String sysId, InputStream is, Map<String, Object> params) throws Exception;

	/**
	 * 保存预览图片
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param path
	 * @param params
	 * @throws Exception
	 */
	public void savePreviewPic(String orgId, String deptId, String sysId, String path, Map<String, Object> params) throws Exception;

	/**
	 * 通过数据id获取附件信息集合
	 * @param recordId
	 * @return
	 * @throws Exception
	 */
	public List<Map<String, Object>> getAttachmentsByRecordId(String recordId) throws Exception;

	/**
	 * 通过数据id获得附件id(获取未删除数据)
	 */
	public List<Map<String, Object>> getAttachByRecordId(String recordId) throws Exception;
	
	/**
	 * 通过数据id获得附件id(获取未删除数据,根据上传类型过滤)
	 */
	public List<Map<String, Object>> getAttachIdByrecordIdByUploadFlag(String recordId, String uploadFlag) throws Exception;
	
	/**
	 * 通过数据id, 上传类型获取附件信息集合
	 */
	public List<Map<String,Object>> getAttachmentsByRecordIdByUploadFlag(String recordId, String uploadFlag) throws Exception;

	/**
	 * 根据存储类型,存储文件到database,disk,fastdfs,mongodb
	 * @author 钟一华
	 * @param fileList
	 * @param param
	 * @param mongoId
	 * @return String
	 * @throws
	 */
	public String saveAttachmentByFileList(List<File> fileList, Map<String, Object> param, String mongoId);
	
	/**
	 * 通过数据id获得附件集合
	 * @author 钟一华
	 * @param recordId
	 * @return
	 * @throws Exception List<Map<String,Object>>
	 * @throws
	 */
	public List<Map<String, Object>> getAttachDatasByRecordId(String recordId) throws Exception;
	
	/**
	 * 通过附件id,sysId,存储类型获取附件流
	 */
	public InputStream getAttachmentInputStream(String attachId, String sysId);
	
	public InputStream getAttachmentInputStream(String attachId, String sysId, HttpServletResponse response);
	
	/**
	 * 将音频文件保存到音频临时文件夹中
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param list
	 * @param path
	 * @throws Exception void
	 * @throws
	 */
	public void saveAudioFileToProjectByIntfs(String orgId, String deptId, String sysId, List<Map<String, Object>> list, String path) throws Exception;
	
	/**
	 * 保存附件信息
	 * @param orgId
	 * @param deptId
	 * @param sysId
	 * @param files
	 * @param param
	 * @throws Exception void
	 * @throws
	 */
	public void saveAttachmentBySaveTypeByIntfs(String orgId, String deptId, String sysId, List<File> files, Map<String, Object> param) throws Exception;
	
	/**
	 * 获取条目所属附件类型的数量,并赋值
	 * @param list
	 * @throws Exception void
	 * @throws
	 */
	public void getAttachClassification(List<Map<String, Object>> list) throws Exception;
	
	/**
	 * 获取条目所属附件类型的数量,返回map
	 * @param list
	 * @throws Exception void
	 * @throws
	 */
	public Map<String, Map<String, Object>> getAttachClassificationForMap(List<String> list) throws Exception;
	
	/**
	 * 获取文件加密KEY
	 * @param file
	 * @return
	 * @throws Exception String
	 * @throws
	 */
	public String getFileKeyByMd5(File file) throws Exception;
	
	/**
	 * 获取流文件
	 * @param mongoId
	 * @param fileId
	 * @param sysId
	 * @return
	 * @throws Exception InputStream
	 * @throws
	 */
	public InputStream getAttachmentIs(String mongoId, String fileId, String sysId) throws Exception;
	
	/**
	 * 删除源转换后文件，插入电子签名后的电子文件
	 * @param param
	 * @throws Exception void
	 * @throws
	 */
	public void insertMongodbByInputStream(Map<String, Object> param, InputStream is) throws Exception;
	
	/**
	 * 更新附件信息
	 * @param id
	 * @param contractid
	 * @throws Exception void
	 * @throws
	 */
	public void updateAttachmentData(Map<String, Object> param) throws Exception;
	
	public Map<String, Object> getAttachmentDataById(String attachId) throws Exception;
	
	/**
	 * 根据附件id和条目id删除relation数据
	 * @param recordId
	 * @param attachId
	 * @throws Exception void
	 * @throws
	 */
	public void deleteCbbDocRelationByRecordIAttachId(String recordId, String attachId) throws Exception;
}
